//
//  NewsView.m
//  Bus
//
//  Created by wangjiajia on 13-7-8.
//  Copyright (c) 2013年 wangjiajia. All rights reserved.
//

#import "NewsView.h"
#import "UIImage+UIImageExtras.h"
#import "MBProgressHUD.h"
#import "Tools.h"
#import "WebServicesUtils.h"
#import "ASIHTTPRequest.h"
#import "JsonParser.h"
#import "News.h"
#import "InfoDetails.h"
#import "EGORefreshTableHeaderView.h"
#import "TableCellSingleton.h"
#import "ASIHTTPRequest.h"
@interface NewsView (){
    //这里声明的都是私有的
    MBProgressHUD * hud;
    //int allCount;//当前已经获取的所有新闻个数
    BOOL isLoadOver;//是否加载完全部数据 defalut='' 相当于NO
    BOOL isLoading;//是否正在加载 default='' 相当于NO
    BOOL clearOldData;//是否清空原数据，初始化和下拉刷新时需要清空
    ASIHTTPRequest* currentRequest;
}

@end

@implementation NewsView



- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
    
}


/**
 XEP 插件完成 control shift j==>升级为///
 */
- (void)viewDidLoad
{

    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    
    //修改默认的导航栏背景
    //  UIImageView* imageView = [[[UIImageView alloc] initWithFrame:self.navigationController.navigationBar.frame] autorelease];
    //   imageView.contentMode = UIViewContentModeScaleToFill;
    //  imageView.image = [UIImage imageNamed:@"list_bg.png"];
    
    //UIImageView不行，直接用UIImage
    //官方没有UIImage的缩放功能，所以采用了category方式
     UIImage *bgBarImg=[UIImage imageNamed:@"list_bg64"];
    //UIImage *bgBarImg=[[UIImage imageNamed:@"list_bg.png"] imageByScalingToSize:CGSizeMake(self.navigationController.navigationBar.frame.size.width, self.navigationController.navigationBar.frame.size.height)];
    ////NSLog(@"navigationBar width=%f,height=%f",self.navigationController.navigationBar.frame.size.width,self.navigationController.navigationBar.frame.size.height);320/44
    [self.navigationController.navigationBar setBackgroundImage:bgBarImg forBarMetrics:UIBarMetricsDefault];
    
    //self.navigationItem.title=@"新闻中心";
    //或者
    self.navigationController.navigationBar.topItem.title=@"新闻中心";
    
    self.navigationItem.leftItemsSupplementBackButton = YES;
    //设置View背景色=>xib设置了White
    //[self.view setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"listBG"]]];
    
    //设置TableView背景
    //[self.newsTableView setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"view_bg0.png"]]];
    
    if (_refreshHeaderView == nil) {
		
		EGORefreshTableHeaderView *view = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0.0f, 0.0f - self.newsTableView.bounds.size.height, self.view.frame.size.width, self.newsTableView.bounds.size.height)];
        ////NSLog(@"width=%f,height=%f,view.width=%f", self.newsTableView.bounds.size.width, self.newsTableView.bounds.size.height,self.view.frame.size.width);bounds是指 控件的尺寸
        
		view.delegate = self;//和网络请求有异曲同工之妙，将自身作为代理，view在适当时候会调本类实现的代理方法
		
        [self.newsTableView addSubview:view];
		_refreshHeaderView = view;//让外部_refreshHeaderView指向这个view，便于访问。当然也可以用_refreshHeaderView直接初始化赋值，不用view
	}
	//  update the last update date
	[_refreshHeaderView refreshLastUpdatedDate];
    
    //NSLog(@"新闻 viewDidLoad");
    //初始化newsArray
    newsArray=[[NSMutableArray alloc] initWithCapacity:12];
    
    //添加广播处理：当点击当前Tab时，触动手动刷新
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(clickCurrentTab:) name:@"Notification_TabClick" object:nil];
    
    [self requestForFirstPage];
    
    
    //NSLog(@"%@",NSStringFromCGRect(self.newsTableView.frame));
}


- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)viewDidUnload {
    [self setNewsTableView:nil];//_newsTableView=nil;
    _refreshHeaderView=nil;
    [newsArray removeAllObjects];
    newsArray=nil;
    [super viewDidUnload];
    //NSLog(@"====>>>>>>>>>viewDidUnlaod释放内存");
}

-(void)viewWillDisappear:(BOOL)animated{
    if(currentRequest)
        [currentRequest clearDelegatesAndCancel];
    [super viewWillDisappear:animated];
    
}
#pragma mark- 类方法具体实现

-(void)requestForFirstPage{
    if(isLoading){
        //NSLog(@"上一个请求正在处理中，本次请求被忽略！");
        [Tools toastNotification:@"请等待上一个请求完成！" andView:self.view andLoading:NO andIsBottom:NO];
        return;
    }
    isLoading=YES;
    clearOldData=YES;
    if(!hud)
    {
        hud=[[MBProgressHUD alloc] initWithView:self.view];
        //hud.labelFont=[UIFont fontWithName:@"-" size:16];//放在默认里面
    }
    //[self clearData];//清空原来的数据.这里清空时机不合适！！！
    //原因:清除数据源后，在获得请求返回的数据之前，数据源为空。此时再下拉刷新，系统会对“越界”的TableViewCell重绘，需要数据源来加载数据。由于此时数据源为空，那么就有异常！ index 4 beyond bounds for empty array。说明下拉过了第4个，释放第4个TableViewCell，回位时，重新加载第4个。没有数据源而报错！精辟！
    
    [Tools showHUD:@"正在获取数据..." andView:self.view andHUD:hud];
    currentRequest= [WebServicesUtils getNewsInfoPageIndex:1 andPageSize:default_page_size newsType:InNews withDelegate:self];
}
-(void)requestForNextPage{
    
    if(isLoading){
        //NSLog(@"上一个请求正在处理中，本次请求被忽略！");
        [Tools toastNotification:@"请等待上一个请求完成！" andView:self.view andLoading:NO andIsBottom:NO];
        return;
    }
    if(isLoadOver){
        [Tools toastNotification:@"数据已经全部加载完!" andView:self.view andLoading:NO andIsBottom:NO];
        //NSLog(@"数据已经全部加载完，没有数据了！");
        return;
    }
    //合二为一
    //    if(isLoading || isLoadOver){
    //        return;
    //    }
    isLoading=YES;
    clearOldData=NO;
    if(!hud)
    {
        hud=[[MBProgressHUD alloc] initWithView:self.view];
    }
    
    [Tools showHUD:@"正在获取数据..." andView:self.view andHUD:hud];
    int pageIndex= newsArray.count/default_page_size+1;
    currentRequest=  [WebServicesUtils getNewsInfoPageIndex:pageIndex andPageSize:default_page_size newsType:InNews withDelegate:self];
}
-(void)clearData{
    if(newsArray)
    {
        //NSLog(@"初次加载或下拉刷新时>清空原数据%d条",newsArray.count);
        [newsArray removeAllObjects];
        isLoadOver=NO;
    }
}


#pragma mark - UITableViewDelegate协议实现

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    if (indexPath.row>=newsArray.count) {//加载更多
        //NSLog(@"加载更多...");
        [self.newsTableView reloadData];
        if(!isLoadOver)
        {
            //@pswjj刷新当前可见的页面，最后一个“加载更多”会刷新，而且也不会滚到第一个了。否则，系统在调用didSelectRowAtIndexPath方法时，自动滚到第一个！
            //[self.newsTableView reloadData];
            
            [self requestForNextPage];
        }
        else
        {
            //[self.newsTableView reloadData];//避免滚到第一个，而后面的又访问不到。放在上一句下一句均可以呢！
            [Tools toastNotification:@"没有更多数据了！" andView:self.view andLoading:NO andIsBottom:NO];
            
        }
        return;
    }
    
    InfoDetails* details=[[InfoDetails alloc] init];
    details.navigationTitle=@"新闻中心";
    details.newsID=((News*)[newsArray objectAtIndex:[indexPath row]]).articleID;
    /**
     使用pushViewController切换到下一个视图时，navigation controller按照以下3条顺序更改导航栏的左侧按钮。
     
     1、如果B视图有一个自定义的左侧按钮（leftBarButtonItem），则会显示这个自定义按钮；
     
     2、如果B没有自定义按钮，但是A视图的backBarButtonItem属性有自定义项，则显示这个自定义项；
     
     3、如果前2条都没有，则默认显示一个后退按钮，后退按钮的标题是A视图的标题。
     
     所以想自定义，则在B视图指定leftBarButtonItem 或在A视图指定
     backBarButtonItem。如果2个都指定，B中 leftBarButtonItem 优先于A 中backBarButtonItem。
     */
    [self.navigationController pushViewController:details animated:YES];
    
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return 64;
}
#pragma mark - UITableViewDataSource协议实现

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return [newsArray count]+1;
    
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    //该方法在滚动时 由系统不断 调用 以重绘界面
    //如果为最后一个则返回加载更多
    if (indexPath.row>=newsArray.count) {
        //返回的这个Cell 字面提示会根据isLoadOver isLaoding 动态判断
        return [TableCellSingleton getLoadMoreCell:self.newsTableView isLoadOver:isLoadOver isLaoding:isLoading];
    }
    
    static  NSString * identifier=@"NewsCellIdentifier";
    //预先注册法
    /*
     static BOOL nibsRegistered=NO;
     if(!nibsRegistered){
     UINib* nib=[UINib nibWithNibName:@"tableViewCellName" bundle:nil];
     [self.newsTableView registerNib:nib forCellReuseIdentifier:identifier];
     nibsRegistered=YES;
     }*/
    
    UITableViewCell *cell=[self.newsTableView dequeueReusableCellWithIdentifier:identifier];
    if(cell==nil){
        //不变的放这里。自带的或者自定义的TableViewCell都行。
        cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier];
        cell.imageView.image=[UIImage imageNamed:@"news.png"];
        
        
        //[cell setBackgroundColor:[UIColor redColor]];//没用
        cell.backgroundView=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"list_bg.png"]];
        cell.textLabel.backgroundColor=[UIColor clearColor];
        //[cell.textLabel setAdjustsFontSizeToFitWidth:YES];//自动调整大小
        cell.detailTextLabel.backgroundColor=[UIColor clearColor];
        cell.detailTextLabel.textColor=[UIColor blackColor];
        //[cell.backgroundView setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"list_bg.png"]]];//没用
        
    }
    
    //变化的放这里:绑定值
    News* newsItem=[newsArray objectAtIndex:indexPath.row];
    
    //cell.textLabel.numberOfLines=1;//default
    cell.textLabel.lineBreakMode=UILineBreakModeMiddleTruncation;
    cell.textLabel.text=newsItem.title;
    
    cell.detailTextLabel.numberOfLines=0;//行数由内容动态决定，不人为限制,默认1行
    //cell.detailTextLabel.lineBreakMode=UILineBreakModeWordWrap;//超出行宽时采用的模式
    cell.detailTextLabel.text=[NSString stringWithFormat:@"发布人:%@\n发布时间:%@",newsItem.sendUserName,newsItem.sendTime];
    
    return cell;
    
}

#pragma mark - 处理网络请求回调
-(void)requestFinished:(ASIHTTPRequest *)request{
    //请求响应太快了，无法观察！所以需要模拟请求耗时
    //[NSThread sleepForTimeInterval:3];
    if(hud){
        [hud hide:YES];
    }
    isLoading=NO;
    if(clearOldData){//如果只是请求第一页，需要清空原数据！（初次加载或下拉刷新时）
        [self clearData];
    }
    NSString * responseStr=[request responseString];
    ////NSLog(@"%@",responseStr);
    NSMutableArray*  newsArrayTemp=[JsonParser parseAsNews:responseStr];
    //allCount+=newsArrayTemp.count;
    //按道理应该解析为12条数据，如果少于12条，则表明加载完毕了。
    //如果=12条，则可能还有下一页数据。
    //NSLog(@"获取%d条新闻中心数据",newsArrayTemp.count);
    if(newsArrayTemp.count<default_page_size){
        isLoadOver=YES;
    }
    NSInteger showIndex=[newsArray count];//记录下一个显示下标位置(count-1)+1=count
    [newsArray addObjectsFromArray:newsArrayTemp];//这个newsArray需要先初始化好，否则newsArray无效，add不了数据，界面无显示。
    
    //NSLog(@"目前总共有新闻中心数据%d条",newsArray.count);
    //[self.newsTableView setScrollsToTop:NO];//直接接着加载数据，不用滚到第一个。ps:原来如此简单，研究了开源社区源码老半天都没发现它是如何设置的。。。看来有时自己更靠谱!后来才发现，关键在于@pswjj
    [self.newsTableView reloadData];//加载数据到界面
    [self.newsTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:showIndex inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];
    [self.newsTableView flashScrollIndicators];//滚动条闪动，提示用户可以滚动
    //对于下拉刷新，通知它处理完成，结束动画
    [self doneLoadingTableViewData];
    //反馈信息
    [Tools toastNotification:[NSString stringWithFormat:@"获取数据%d条,共%d条%@",newsArrayTemp.count,newsArray.count,isLoadOver?@",已加载全部数据!":@""] andView:self.view andLoading:NO andIsBottom:NO];
}

-(void)requestFailed:(ASIHTTPRequest *)request{
    //NSLog(@"处理请求失败%@",request.responseString);
    if(hud){
        [hud hide:YES];
    }
    //可以换成友好的顶部弹出提示
    //UIAlertView *alert=  [[UIAlertView alloc] initWithTitle:@"提示" message:@"网络请求错误!" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil] ;
    //
    //    [alert show];
    [Tools toastNotification:@"处理请求失败，请检查网络连接!" andView:self.view andLoading:NO andIsBottom:NO];
    //对于下拉刷新，通知它处理完成，结束动画，否则一直在那里显示！！！
    [self doneLoadingTableViewData];
    //对于最后一个加载更多，不要一直显示正在加载
    isLoading=NO;//如果设置成YES，表名上一个请求一直在处理中，无法处理下一个请求
    isLoadOver=NO;
    //NSLog(@"%d",newsArray.count);
    [self.newsTableView reloadData];
    
}


#pragma mark - 数据源 当前加载状态
//标记正在加载中
- (void)reloadTableViewDataSource{
	
	//  should be calling your tableviews data source model to reload
	//  put here just for demo
	_reloading = YES;
	
}
//标记加载完成，结束动画
- (void)doneLoadingTableViewData{
	
	//  model should call this when its done loading
	_reloading = NO;
    //结束动画,并对当前数据进行处理
	[_refreshHeaderView egoRefreshScrollViewDataSourceDidFinishedLoading:self.newsTableView];
	
}


#pragma mark- 重写?UIScrollViewDelegate方法 用于箭头动画 在UITableView滑动时触发
//如何映射到这个方法呢，只要有UIScrollView就会自动映射？
//这是一个代理，UITableView:UIScrollView 而在UIScrollView中定义了该代理
//在滑动时 会通知代理调用方法
//代理方法也可以被重写？

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    //滑动过程中，不管往下滑或则往上回滑，都会不断调用
	[_refreshHeaderView egoRefreshScrollViewDidScroll:scrollView];//控件内部处理
    ////NSLog(@"scrollViewDidScroll");
}

//结束拖拽
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
	
	[_refreshHeaderView egoRefreshScrollViewDidEndDragging:scrollView];
	// //NSLog(@"scrollViewDidEndDragging");
}

#pragma mark- EGORefreshTableHeaderDelegate 代理的具体实现

-(BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView *)view{
    return _reloading; // 应该返回，用于判断是否在加载中以避免重叠加载
}
-(NSDate *)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView *)view{
	return [NSDate date]; // 应该返回，用这个时间更新view的最后更新日期
}
//触发刷新方法——业务代码都在这里
-(void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView *)view{
    [self reloadTableViewDataSource];//标记加载中
    //业务代码
    [self requestForFirstPage];
    //标记加载完成，结束view动画，延迟3秒以模拟业务处理时间。
	//[self performSelector:@selector(doneLoadingTableViewData) withObject:nil afterDelay:3];
}


#pragma mark- 处理广播时的手动刷新
- (void)clickCurrentTab:(NSNotification *)notification
{
    if (notification.object) {
        if ([(NSString *)notification.object isEqualToString:@"0"]) {
            //手动下拉75像素(负数是Y轴正向)
            [self.newsTableView setContentOffset:CGPointMake(0,-75) animated:YES];
            [self performSelector:@selector(doneManualRefresh) withObject:nil afterDelay:0.4];//给上面的动画0.4秒显示时间，之后调用doneManualRefresh。
        }
    }
}
- (void)doneManualRefresh
{
    [_refreshHeaderView egoRefreshScrollViewDidScroll:self.newsTableView];
    [_refreshHeaderView egoRefreshScrollViewDidEndDragging:self.newsTableView];//由于此时的距离是75，会触发delegete的方法=>下拉刷新
}

#pragma mark- 从详情视图返回到本视图时，刷新数据，避免系统对资源回收照成TableViewCell滚不动！
-(void)viewWillAppear:(BOOL)animated{
    ////NSLog(@"界面即将出现!");
    if(newsArray){
        [self.newsTableView reloadData];
        //NSLog(@"界面即将显示，reloadData 还原现场。");
    }
    
}
@end
